Problem
震波
Description
在一片土地上有个城市,通过条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为,其中第i个城市的价值为。
不幸的是,这片土地常常发生地震,并且随着时代的发展,城市的价值也往往会发生变动。
接下来你需要在线处理次操作:
- 表示发生了一次地震,震中城市为,影响范围为,所有与距离不超过的城市都将受到影响,该次地震造成的经济损失为所有受影响城市的价值和。
- 表示第个城市的价值变成了。
为了体现程序的在线性,操作中的都需要异或你程序上一次的输出来解密,如果之前没有输出,则默认上一次的输出为。
Input
第一行包含两个正整数和。
第二行包含个正整数,第个数表示。
接下来行,每行包含两个正整数,表示和之间有一条无向边。
接下来行,每行包含三个数,表示次操作。
Output
Sample Input
1 | 8 1 |
Sample Output
1 | 11100101 |
Hint
标签:动态点分治
Solution
终于学会动态点分辣QAQ~
赶快来肝几道基础题
先不考虑时间复杂度,那么对于每个操作显然可以暴力从震源向上爬统计答案。每次加上当前子树中距离符合题意的点,再减去其儿子(就是向上爬时此点的前驱)的子树中与其算重复的点。这样维护两个树状数组即可。
但是树高可以构造比大,这时就需要建立点分树,把树高降成。
提取重心建立点分树,对每个分治中心维护两个树状数组,第一个是其子树中到此分治中心的每种距离的所有点的点权和,第二个是其子树中到此分治中心的上一层分治中心的每种距离的所有点的点权和。
这样对于询问,每次向上爬,爬到每个分治中心统计;对于修改,每次向上爬,爬到每个分治中心更新树状数组即可。这样总复杂度是。
不过此题有些卡常,有三种策略:
- 用做
- 带
fread
大读优 - 将棵树状数组建到同一个大数组上,每个记录其起始指针和终止指针,可以避免
vector
的一些常数
Code
1 |
|